<?php

namespace app\common\paginator;

use think\Paginator;

class Zui extends Paginator {
	/**
	 * 首页
	 * 
	 * @param string $text        	
	 * @return string
	 */
	protected function getFirstButton($text = "首页") {
		if ($this->currentPage () == 1) {
			return $this->getDisabledTextWrapper ( $text );
		}
		
		$url = $this->url ( 1 );
		
		return $this->getPageLinkWrapper ( $url, $text );
	}
	/**
	 * 末页
	 * 
	 * @param string $text        	
	 * @return string
	 */
	protected function getLastButton($text = "末页") {
		if ($this->currentPage () == $this->lastPage) {
			return $this->getDisabledTextWrapper ( $text );
		}
		
		$url = $this->url ( $this->lastPage );
		
		return $this->getPageLinkWrapper ( $url, $text );
	}
	protected function getPromptHtml() {
		$text = '共 <strong>' . $this->total . '</strong> 条记录, 每页 <strong>' . $this->listRows . '</strong> 条 , <strong>' . $this->currentPage . '/' . $this->lastPage . '</strong> ';
		return $this->getPromptPageWrapper ( $text );
	}
	
	/**
	 * 上一页按钮
	 * 
	 * @param string $text        	
	 * @return string
	 */
	protected function getPreviousButton($text = "上页") {
		if ($this->currentPage () <= 1) {
			return $this->getDisabledTextWrapper ( $text );
		}
		
		$url = $this->url ( $this->currentPage () - 1 );
		
		return $this->getPageLinkWrapper ( $url, $text );
	}
	
	/**
	 * 下一页按钮
	 * 
	 * @param string $text        	
	 * @return string
	 */
	protected function getNextButton($text = '下页') {
		if (! $this->hasMore) {
			return $this->getDisabledTextWrapper ( $text );
		}
		
		$url = $this->url ( $this->currentPage () + 1 );
		
		return $this->getPageLinkWrapper ( $url, $text );
	}
	
	/**
	 * 页码按钮
	 * 
	 * @return string
	 */
	protected function getLinks() {
		if ($this->simple)
			return '';
		
		$block = [ 
				'first' => null,
				'slider' => null,
				'last' => null 
		];
		
		$side = 3;
		$window = $side * 2;
		
		if ($this->lastPage < $window + 6) {
			$block ['first'] = $this->getUrlRange ( 1, $this->lastPage );
		} elseif ($this->currentPage <= $window) {
			$block ['first'] = $this->getUrlRange ( 1, $window + 2 );
			$block ['last'] = $this->getUrlRange ( $this->lastPage - 1, $this->lastPage );
		} elseif ($this->currentPage > ($this->lastPage - $window)) {
			$block ['first'] = $this->getUrlRange ( 1, 2 );
			$block ['last'] = $this->getUrlRange ( $this->lastPage - ($window + 2), $this->lastPage );
		} else {
			$block ['first'] = $this->getUrlRange ( 1, 2 );
			$block ['slider'] = $this->getUrlRange ( $this->currentPage - $side, $this->currentPage + $side );
			$block ['last'] = $this->getUrlRange ( $this->lastPage - 1, $this->lastPage );
		}
		
		$html = '';
		
		if (is_array ( $block ['first'] )) {
			$html .= $this->getUrlLinks ( $block ['first'] );
		}
		
		if (is_array ( $block ['slider'] )) {
			$html .= $this->getDots ();
			$html .= $this->getUrlLinks ( $block ['slider'] );
		}
		
		if (is_array ( $block ['last'] )) {
			$html .= $this->getDots ();
			$html .= $this->getUrlLinks ( $block ['last'] );
		}
		
		return $html;
	}
	
	/**
	 * 渲染分页html
	 * 
	 * @return mixed
	 */
	public function render() {
		if ($this->hasPages ()) {
			if ($this->simple) {
				return sprintf ( '<ul class="pager">%s %s</ul>', $this->getPreviousButton (), $this->getNextButton () );
			} else {
				return sprintf ( '<div class="table-pager">%s %s %s %s %s</div>', $this->getPromptHtml (), $this->getFirstButton (), $this->getPreviousButton (), $this->getNextButton (), $this->getLastButton () );
			}
		}
	}
	protected function getPromptPageWrapper($text = "") {
		return '<span class="text-muted">' . $text . '</span>';
	}
	
	/**
	 * 生成一个可点击的按钮
	 *
	 * @param string $url        	
	 * @param int $page        	
	 * @return string
	 */
	protected function getAvailablePageWrapper($url, $page) {
	    foreach (request()->param() as $key=>$value){
            if ($key !== 'page'){
                $url .= '&'.$key.'='.$value;
            }
        }
		return '<span><a href="' . htmlentities ( $url ) . '">' . $page . '</a></span>';
	}
	
	/**
	 * 生成一个禁用的按钮
	 *
	 * @param string $text        	
	 * @return string
	 */
	protected function getDisabledTextWrapper($text) {
		return '<span class="disabled">' . $text . '</span>';
	}
	
	/**
	 * 生成一个激活的按钮
	 *
	 * @param string $text        	
	 * @return string
	 */
	protected function getActivePageWrapper($text) {
		return '<span class="active">' . $text . '</span>';
	}
	
	/**
	 * 生成省略号按钮
	 *
	 * @return string
	 */
	protected function getDots() {
		return $this->getDisabledTextWrapper ( '...' );
	}
	
	/**
	 * 批量生成页码按钮.
	 *
	 * @param array $urls        	
	 * @return string
	 */
	protected function getUrlLinks(array $urls) {
		$html = '';
		
		foreach ( $urls as $page => $url ) {
			$html .= $this->getPageLinkWrapper ( $url, $page );
		}
		
		return $html;
	}
	
	/**
	 * 生成普通页码按钮
	 *
	 * @param string $url        	
	 * @param int $page        	
	 * @return string
	 */
	protected function getPageLinkWrapper($url, $page) {
		if ($page == $this->currentPage ()) {
			return $this->getActivePageWrapper ( $page );
		}
		
		return $this->getAvailablePageWrapper ( $url, $page );
	}
}